package com.gxc.number;

/**
 * 7. 整数反转
 * 给你一个 32 位的有符号整数 x ，返回将 x 中的数字部分反转后的结果。
 * 如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ，就返回 0。
 * 假设环境不允许存储 64 位整数（有符号或无符号）。
 * 示例 1：
 *
 * 输入：x = 123
 * 输出：321
 * 示例 2：
 *
 * 输入：x = -123
 * 输出：-321
 * 示例 3：
 *
 * 输入：x = 120
 * 输出：21
 * 示例 4：
 *
 * 输入：x = 0
 * 输出：0
 */
public class Reverse {

    public static void main(String[] args) {
        int x = 123;
        System.out.println(process(x));

        x = -123;
        System.out.println(process(x));

        x = 120;
        System.out.println(process(x));

        x = 0;
        System.out.println(process(x));
    }

    private static int process(int x) {
        if (x<10 && x>-10) return x;

        //位数
        int digit = 0;
        //正负数
        boolean plus = x>0?true:false;
        int result = 0;
        //余数  负数边界比正数大
        int remainder = plus?-x:x;

        //针对超出范围
        if (digit ==12 && remainder % 10>2) {
            return 0;
        }

        while (remainder!=0) {
            remainder = remainder/10;
            digit++;
        }
        remainder = plus?-x:x;
        while (digit!=0) {
            int i = remainder % 10;
            remainder = remainder/10;
            int v = (int) (i * Math.pow(10, digit - 1));
            if (v< Integer.MIN_VALUE - result) return 0;
            result = (result + v);
            digit--;
        }

        return plus?-result:result;
    }

    /**
     * 官方解
     * @param x
     * @return
     */
    public static int process2(int x) {
        int rev = 0;
        while (x != 0) {
            //判断是否越界
            if (rev < Integer.MIN_VALUE / 10 || rev > Integer.MAX_VALUE / 10) {
                return 0;
            }
            int digit = x % 10;
            x /= 10;
            //末尾的数 *10
            rev = rev * 10 + digit;
        }
        return rev;
    }
}
